home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 398 / 398.xpi / chrome / forecastfox.jar / content / options / search.js < prev    next >
Text File  |  2010-02-04  |  8KB  |  287 lines

  1. /*------------------------------------------------------------------------------
  2.   Copyright (c) 2008 Ensolis, LLC. All Rights Reserved.
  3.   ----------------------------------------------------------------------------*/
  4.  
  5. var gSearch = null;
  6.  
  7. function searchLoad()
  8. {
  9.   gSearch = new SearchModule();
  10.   gSearch.start();
  11. }
  12.  
  13. function searchUnload()
  14. {
  15.   gSearch.stop();
  16.   gSearch = null;
  17. }
  18.  
  19. function SearchModule() {}
  20. SearchModule.prototype = {
  21.   _baseURL: "http://forecastfox.accuweather.com/adcbin/forecastfox/locate_city.asp?location=",
  22.   _bundle: null,
  23.   _textbox: null,
  24.   _results: null,    
  25.   _request: null,
  26.   _running: false,
  27.   _sortId: null,
  28.   _sortDirection: null,
  29.   _naturalOrder: null,
  30.        
  31.   start: function SearchModule_start()
  32.   {
  33.     this._bundle = document.getElementById("ff-bundle-search");
  34.     this._textbox = document.getElementById("ff-text-search");
  35.     this._textbox.focus();
  36.     this._textbox.select();
  37.     this._results = document.getElementById("ff-items-results");
  38.   },
  39.   
  40.   stop: function SearchModule_stop()
  41.   {
  42.     this._baseURL = null;  
  43.     this._bundle = null;
  44.     this._textbox = null;
  45.     this._results = null;
  46.     this._request = null;                
  47.     this._running = null;
  48.     this._naturalOrder = null;
  49.     this._sortId = null;
  50.     this._sortDirection = null;
  51.   },
  52.   
  53.   run: function SearchModule_run()
  54.   {
  55.     //do nothing if string not in textbox or request running
  56.     if (!this._textbox.value || this._running)
  57.       return;
  58.     
  59.     //set running
  60.     this._running = true;
  61.     
  62.     //remove old search
  63.     this._clear();
  64.  
  65.     //set label
  66.     this._setLabel("ff.search.loading", null);
  67.  
  68.     //set url
  69.     var URL = encodeURI(this._baseURL + this._textbox.value);
  70.  
  71.     //setup request and send
  72.     var module = this;
  73.     this._request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);
  74.     this._request.open("GET", URL, true);
  75.     this._request.overrideMimeType("text/xml; charset=iso-8859-1");
  76.     this._request.onload = function() { module._onSearchLoad(this.responseXML, this.status); };
  77.     this._request.onerror = function() { module._onSearchError(); };
  78.     try {
  79.       if (this._request.channel instanceof Components.interfaces.nsISupportsPriority)
  80.         this._request.channel.priority = Components.interfaces.nsISupportsPriority.PRIORITY_HIGHEST;
  81.     } catch(e) {}
  82.     this._request.send(null);          
  83.   },
  84.   
  85.   setSort: function SearchModule_setSort(aType)
  86.   {
  87.     var sortId = "ff-col-"+aType;
  88.     var column = document.getElementById(sortId);
  89.     var direction = column.getAttribute("sortDirection");
  90.     
  91.     // set the sort according to the current sort direction on the column
  92.     if (direction == "ascending")
  93.       this._setSort(aType, "descending");
  94.     else if (direction == "descending")
  95.       this._setSort(aType, "natural");
  96.     else
  97.       this._setSort(aType, "ascending");
  98.   },
  99.   
  100.   _setSort: function SearchModule__setSort(aType, aDirection)
  101.   {
  102.     // set the internal sort id and direction
  103.     this._sortId = "ff-col-"+aType;
  104.     this._sortDirection = aDirection;
  105.     
  106.     var columns = document.getElementById("ff-tree-columns");
  107.     columns = columns.getElementsByTagName("treecol");
  108.     
  109.     // update the sort attributes
  110.     for (var x = 0; x < columns.length; x++) {
  111.       if (columns[x].getAttribute("id") == this._sortId)
  112.         columns[x].setAttribute("sortDirection", aDirection);
  113.       else
  114.         columns[x].removeAttribute("sortDirection");
  115.     }
  116.     
  117.     // sort the columns
  118.     this._sort();
  119.   },
  120.   
  121.   _sort: function SearchModule__sort()
  122.   {
  123.     // return if there is no sorting
  124.     if (!this._sortId || !this._sortDirection) return;
  125.     
  126.     var results = document.getElementById("ff-items-results");
  127.     var rows = new Array();
  128.     
  129.     // get the list of rows
  130.     while (results.hasChildNodes()) {
  131.       var result = results.removeChild(results.firstChild);
  132.       if (result.nodeName == "treeitem")
  133.         rows.push(result);
  134.     }
  135.     
  136.     // perform the sort based on the direction
  137.     if (this._sortDirection == "ascending")
  138.       rows.sort(sortAscending);
  139.     else if (this._sortDirection == "descending")
  140.       rows.sort(sortDescending);
  141.     else
  142.       rows = this._naturalOrder;
  143.     
  144.     // then re-insert the rows
  145.     for (var x = 0; x < rows.length; x++)
  146.       results.appendChild(rows[x]);
  147.   },
  148.   
  149.   _clear: function SearchModule__clear()
  150.   {
  151.     while (this._results.hasChildNodes())
  152.       this._results.removeChild(this._results.lastChild);
  153.     
  154.     this._naturalOrder = new Array();
  155.   },
  156.   
  157.   _setLabel: function SearchModule__setLabel(aText, aNode)
  158.   {
  159.     var treeitem, treerow, treecell1, treecell2, treecell3;  
  160.  
  161.     treeitem = document.createElement("treeitem");
  162.     treerow = document.createElement("treerow");
  163.     treecell1 = document.createElement("treecell");
  164.     treecell2 = document.createElement("treecell");  
  165.     treecell3 = document.createElement("treecell");
  166.           
  167.     if (aText) {
  168.       treeitem.setAttribute("id", "na");  
  169.       treecell1.setAttribute("label", this._bundle.getString(aText));
  170.       treecell2.setAttribute("label", "");
  171.       treecell3.setAttribute("label", "");  
  172.     } else {
  173.       treeitem.setAttribute("id", aNode.getAttribute("location"));
  174.       treecell1.setAttribute("label", aNode.getAttribute("city"));
  175.       treecell1.setAttribute("ref", "ff-col-city");
  176.       treecell2.setAttribute("label", aNode.getAttribute("state"));
  177.       treecell2.setAttribute("ref", "ff-col-state");
  178.       treecell3.setAttribute("label", aNode.getAttribute("location"));
  179.       treecell3.setAttribute("ref", "ff-col-id");
  180.     }
  181.     
  182.     treerow.appendChild(treecell1);
  183.     treerow.appendChild(treecell2);  
  184.     treerow.appendChild(treecell3);
  185.     treeitem.appendChild(treerow);
  186.     this._results.appendChild(treeitem);
  187.     this._naturalOrder.push(treeitem);
  188.   },
  189.   
  190.   _onSearchLoad: function SearchModule__onSearchLoad(aResponse, aStatus)
  191.   { 
  192.     //set running to false
  193.     this._running = false;
  194.     
  195.     //clear old results
  196.     this._clear();
  197.   
  198.     //response error
  199.     if (!aResponse || aStatus > 200) {
  200.       this._setLabel("ff.search.error", null);
  201.       return;
  202.     }
  203.  
  204.     //no locations
  205.     var locs = aResponse.getElementsByTagName("location");
  206.     if (locs.length == 0) {
  207.       this._setLabel("ff.search.location", null);
  208.       return;
  209.     }
  210.  
  211.     //populate tree
  212.     for (var i=0; i < locs.length; i++)
  213.       this._setLabel(null, locs[i]);
  214.     
  215.     //sort the columns
  216.     this._sort();
  217.   },
  218.   
  219.   _onSearchError: function SearchModule__onSearchError()
  220.   {
  221.     //set running to false
  222.     this._running = false;
  223.   
  224.     //clear old results
  225.     this._clear();
  226.   
  227.  
  228.     //set error in tree
  229.     this._setLabel("ff.search.error", null);  
  230.   },
  231.   
  232.   accept: function SearchModule_accept(aClose)
  233.   {
  234.     var tree = document.getElementById("ff-tree-results");
  235.   
  236.     //if nothing selected return
  237.     if (tree.currentIndex == -1) {
  238.       if (aClose) {
  239.         window.close();
  240.         return;
  241.       } else
  242.       return;
  243.     }
  244.   
  245.     //if no location return
  246.     var current = tree.view.getItemAtIndex(tree.currentIndex).getAttribute("id");
  247.     if (current == "na") {
  248.       if (aClose) {
  249.         window.close();
  250.         return;
  251.       } else
  252.       return;
  253.     }
  254.  
  255.     //set location value
  256.     var locid = window.opener.document.getElementById("ff-text-code");
  257.     locid.value = current;
  258.   
  259.     //update apply button
  260.     window.opener.updateButtons();
  261.     window.close();  
  262.   }
  263. };
  264.  
  265. function sortDescending(aItem1, aItem2) {
  266.   var label1 = getCellForId(aItem1).getAttribute("label");
  267.   var label2 = getCellForId(aItem2).getAttribute("label");
  268.   if (label1 > label2)
  269.     return -1;
  270.   else if (label1 == label2)
  271.     return 0;
  272.   else
  273.     return 1;
  274. }
  275.  
  276. function sortAscending(aItem1, aItem2) {
  277.   return sortDescending(aItem1, aItem2) * -1;
  278. }
  279.   
  280. function getCellForId(aTreeitem) {
  281.   var cells = aTreeitem.getElementsByTagName("treecell");
  282.   for (var x = 0; x < cells.length; x++) {
  283.     if (cells[x].getAttribute("ref") == gSearch._sortId)
  284.       return cells[x];
  285.   }
  286.   return null;
  287. }